// import App from "@/App.vue"
// 进行axios二次封装，使用请求和响应拦截器
import axios from 'axios'
import { ElMessage } from 'element-plus'
// 引入用户相关仓库
import useUserStore from '@/store/modules/user'
import router from '@/router'
// import { GET_TOKEN } from './token'
// import qs from "qs"

//! 定义一个名为config的配置对象
let config = {
    baseURL: import.meta.env.VITE_APP_BASE_API, // 基础路径
    timeout: 170000, //由于免费服务器网速较慢，临时更改请求时间
    timeoutMessage: "请求超时，请检查您的网络连接"
}

// 第一步，利用axios对象的create方法，去创建axios实例（基础路径，超时时间）
const request = axios.create(config);

// 第二步，request实例添加请求与响应拦截器
request.interceptors.request.use(
    (config) => {
        // 获取用户相关小仓库：获取仓库内部的token
        let userStore = useUserStore();
        // config配置对象，headers属性请求头，经常给服务端携带公共参数
        // 返回配置对象
        if (userStore.token) {
            config.headers.token = userStore.token
        }
        config.headers.aaa = "aaaa"
        return config
    }, (error) => {
        return Promise.reject(error);
    }
)


// 第三步：响应拦截器
request.interceptors.response.use(
    response => {
        const newToken = response.headers['token'];
        if (newToken != undefined) {
            let userStore = useUserStore();
            userStore.saveToken(newToken)
        }
        if (response.data.code === 401) {
            ElMessage.error(response.data.msg)
            router.push({
                path: '/login',
                query: { redirect: router.currentRoute.value.fullPath } // 记录当前完整路径
            })
        }
        return response
    },
    error => {
        // 失败回调：处理http网络错误
        // 定义一个变量：存储网络的错误信息
        let message = "";
        if (error.response) {
            // http状态码
            let status = error.response.status
            switch (status) {
                case 401:
                    message = "TOKEN过期"
                    break;
                case 403:
                    message = "无权访问"
                    break
                case 404:
                    message = "请求地址错误"
                    break
                case 500:
                    message = "服务器错误"
                    break
                default:
                    message = "网络错误"
                    break
            }
        } else {
            if (error.code === 'ECONNABORTED') {
                message = config.timeoutMessage
            } else {
                message = "其它原因"
            }
        }

        // 提示错误信息
        ElMessage({
            type: 'error',
            message
        })

        return Promise.reject(error)
    })


// 对外暴漏
export default request;

// 定义一个封装函数req，用来根据不同的method属性，发起不同类型的request请求
// @ts-ignore
export const req = ({ method, url, config, data }) => {
    // 调用string.toLowerCase()方法将method方法转换为大写
    method = method.toLowerCase();
    switch (method) {
        case "post": {
            return request.post(url, data, { ...config });
        }
        case "get": {
            return request.get(url, { params: data, ...config });
        }
        case "delete": {
            return request.delete(url, { params: data, ...config });
        }
        case "put": {
            return request.put(url, data, { ...config });
        }
        default: {
            console.error(`未知的请求方式：${method}`);
            return false
        }
    }
}